﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlClient;

namespace FrbaCommerce.Abm_Cliente
{
    public partial class frm_crearCliente : Form
    {
        private bool tipoNroDocValido = false;
        private bool telefonoCliValido = false;
        private bool cuilValido = false;
        private bool camposObligatorios = false;

        public frm_crearCliente()
        {
            InitializeComponent();
        }

        private void frm_crearCliente_Load(object sender, EventArgs e)
        {
            BaseDeDatos baseDeDatos = BaseDeDatos.Instance;
            SqlCommand sqlCommand = new SqlCommand();
            sqlCommand.CommandText = "LOS_GDDES.SP_TRAER_TIPOS_DOCUMENTO";
            sqlCommand.CommandType = CommandType.StoredProcedure;
            DataTable dt_tiposDocumento = baseDeDatos.consulta(sqlCommand);
            cmb_tipoDocCliente.DataSource = dt_tiposDocumento;
            cmb_tipoDocCliente.DisplayMember = "DESCRIPCION";
            cmb_tipoDocCliente.ValueMember = "ID_TIPO_DOC";
        }

        private void btn_autogenerar_Click(object sender, EventArgs e)
        {
            BaseDeDatos baseDeDatos = BaseDeDatos.Instance;
            SqlCommand sqlCommand = new SqlCommand();
            sqlCommand.CommandText = "SELECT MAX(ID_USUARIO) FROM LOS_GDDES.USUARIOS;";
            sqlCommand.CommandType = CommandType.Text;
            int idUsuario = baseDeDatos.ejecuta(sqlCommand) + 1;
            string nombreDeUsuario = "usuario" + Convert.ToString(idUsuario);
            txt_nombreDeUsuario.Text = nombreDeUsuario;
            txt_contrasenia.Text = "contrasenia" + Convert.ToString(idUsuario);
        }

        //---Validar Campos del Cliente---//       
        private void txt_nroDoc_Leave(object sender, EventArgs e)
        {
            validar_nroDocCli();
        }

        private void validar_nroDocCli()
        {
            if (txt_nroDoc.Text != "")
            {
                BaseDeDatos baseDeDatos = BaseDeDatos.Instance;
                SqlCommand sqlCommand = new SqlCommand();
                sqlCommand.CommandText = "LOS_GDDES.SP_VALIDAR_CLIENTE_TIPO_NRO_DOC";
                sqlCommand.CommandType = CommandType.StoredProcedure;
                sqlCommand.Parameters.AddWithValue("@id_tipo_doc", Convert.ToInt32(cmb_tipoDocCliente.SelectedValue));
                sqlCommand.Parameters.AddWithValue("@nro_doc", Convert.ToInt32(txt_nroDoc.Text));
                int tipoNroDocExistente = baseDeDatos.ejecuta(sqlCommand);

                if (tipoNroDocExistente > 0)
                {
                    txt_nroDoc.BackColor = Color.Red;
                    tipoNroDocValido = false;
                }
                else
                {
                    txt_nroDoc.BackColor = Color.White;
                    tipoNroDocValido = true;
                }
            }
        }

        private void txt_telCliente_Leave(object sender, EventArgs e)
        {
            validar_telCli();
        }

        private void validar_telCli()
        {
            if (txt_telCliente.Text != "")
            {
                BaseDeDatos baseDeDatos = BaseDeDatos.Instance;
                SqlCommand sqlCommand = new SqlCommand();
                sqlCommand.CommandText = "LOS_GDDES.SP_VALIDAR_CLIENTE_TELEFONO";
                sqlCommand.CommandType = CommandType.StoredProcedure;
                sqlCommand.Parameters.AddWithValue("@telefono", Convert.ToInt32(txt_telCliente.Text));
                int telefonoCliExistente = baseDeDatos.ejecuta(sqlCommand);

                if (telefonoCliExistente > 0)
                {
                    txt_telCliente.BackColor = Color.Red;
                    telefonoCliValido = false;
                }
                else
                {
                    txt_telCliente.BackColor = Color.White;
                    telefonoCliValido = true;
                }
            }
        }

        private void txt_cuilCliente_Leave(object sender, EventArgs e)
        {
            validar_cuilCli();
        }

        private void validar_cuilCli()
        {
            if (txt_cuilCliente.Text != "")
            {
                if (FuncionesUtiles.validateCuit(txt_cuilCliente.Text) == true)
                {
                    BaseDeDatos baseDeDatos = BaseDeDatos.Instance;
                    SqlCommand sqlCommand = new SqlCommand();
                    sqlCommand.CommandText = "LOS_GDDES.SP_VALIDAR_CLIENTE_CUIL";
                    sqlCommand.CommandType = CommandType.StoredProcedure;
                    sqlCommand.Parameters.AddWithValue("@cuil", txt_cuilCliente.Text);
                    int cuilCliExistente = baseDeDatos.ejecuta(sqlCommand);

                    if (cuilCliExistente > 0)
                    {
                        txt_cuilCliente.BackColor = Color.Red;
                        cuilValido = false;
                    }
                    else
                    {
                        txt_cuilCliente.BackColor = Color.White;
                        cuilValido = true;
                    }
                }
                else
                {
                    txt_cuilCliente.BackColor = Color.Red;
                    cuilValido = false;
                }
            }
            else
            {
                txt_cuilCliente.BackColor = Color.White;
                cuilValido = true;
            }
        }
        //---Validar Campos del Cliente---//

        //---Validar Campos Obligatorios Completos---//
        private void verificar_campos_obligatorios()
        {
            var camposObligatorios = new List<Control>();
            camposObligatorios.Add(txt_nombreDeUsuario);
            camposObligatorios.Add(txt_contrasenia);
            camposObligatorios.Add(txt_nombreCliente);
            camposObligatorios.Add(txt_apellidoCliente);
            camposObligatorios.Add(txt_nroDoc);
            camposObligatorios.Add(txt_emailCliente);
            camposObligatorios.Add(txt_telCliente);
            camposObligatorios.Add(txt_dirCliente);
            camposObligatorios.Add(txt_nroDirCliente);
            camposObligatorios.Add(txt_localidadCliente);
            camposObligatorios.Add(txt_CPCliente);
            camposObligatorios.Add(dtp_fecNacCliente);
            camposObligatorios.Add(cmb_tipoDocCliente);
          
            if (camposObligatorios.All<Control>(campos => campos.Text != ""))
                this.camposObligatorios = true;
            else
                this.camposObligatorios = false;

            var camposIncompletos = camposObligatorios.FindAll(campos => campos.Text == "");
            camposIncompletos.ForEach(campos => campos.BackColor = Color.Red);
            var camposCompletos = camposObligatorios.FindAll(campos => campos.Text != "");
            camposCompletos.ForEach(campos => campos.BackColor = Color.White);
        }
        //---Validar Campos Obligatorios Completos---//

        private void btn_guardar_Click(object sender, EventArgs e)
        {
            this.verificar_campos_obligatorios();
            this.validar_nroDocCli();
            this.validar_telCli();
            this.validar_cuilCli();

            if (tipoNroDocValido && telefonoCliValido && cuilValido && camposObligatorios)
            {
                this.registrar_usuario_cliente();
                this.Close();
            }
        }

        private void btn_limpiar_Click(object sender, EventArgs e)
        {
            this.Controls.OfType<GroupBox>().ToList().ForEach(groupBox => groupBox.Controls.OfType<TextBox>().ToList().ForEach(textBox => textBox.Text = String.Empty));
        }

        private void btn_cancelar_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void registrar_usuario_cliente()
        {
            BaseDeDatos baseDeDatos = BaseDeDatos.Instance;
            SqlCommand sqlCommand = new SqlCommand();
            sqlCommand.CommandText = "LOS_GDDES.SP_INSERTAR_USUARIO";
            sqlCommand.CommandType = CommandType.StoredProcedure;
            sqlCommand.Parameters.AddWithValue("@username", txt_nombreDeUsuario.Text);
            string contraseniaEncriptada = Encriptar.SHA256(txt_contrasenia.Text);
            sqlCommand.Parameters.AddWithValue("@password", contraseniaEncriptada);
            baseDeDatos.ejecuta(sqlCommand);

            sqlCommand.CommandText = "UPDATE LOS_GDDES.USUARIOS SET PRIMER_ACCESO = 1 " +
                                     "WHERE USERNAME = @username;";
            sqlCommand.CommandType = CommandType.Text;
            sqlCommand.Parameters.Clear();
            sqlCommand.Parameters.AddWithValue("@username", txt_nombreDeUsuario.Text);
            baseDeDatos.ejecuta(sqlCommand);

            sqlCommand.CommandText = "LOS_GDDES.SP_INSERTAR_CLIENTE";
            sqlCommand.CommandType = CommandType.StoredProcedure;
            sqlCommand.Parameters.Clear();
            sqlCommand.Parameters.AddWithValue("@username", txt_nombreDeUsuario.Text);
            sqlCommand.Parameters.AddWithValue("@nombre", txt_nombreCliente.Text);
            sqlCommand.Parameters.AddWithValue("@apellido", txt_apellidoCliente.Text);
            sqlCommand.Parameters.AddWithValue("@id_tipo_doc", Convert.ToInt32(cmb_tipoDocCliente.SelectedValue)); //Cambiar
            sqlCommand.Parameters.AddWithValue("@nro_doc", Convert.ToInt32(txt_nroDoc.Text));
            sqlCommand.Parameters.AddWithValue("@mail", txt_emailCliente.Text);
            sqlCommand.Parameters.AddWithValue("@telefono", Convert.ToInt32(txt_telCliente.Text));
            sqlCommand.Parameters.AddWithValue("@direccion_nombre", txt_dirCliente.Text);
            sqlCommand.Parameters.AddWithValue("@direccion_nro", Convert.ToInt32(txt_nroDirCliente.Text));
            if(txt_pisoDirCliente.Text != "")
                sqlCommand.Parameters.AddWithValue("@nro_piso", Convert.ToInt32(txt_pisoDirCliente.Text));
            if (txt_dptoDirCliente.Text != "")
                sqlCommand.Parameters.AddWithValue("@depto", txt_dptoDirCliente.Text);
            sqlCommand.Parameters.AddWithValue("@localidad", txt_localidadCliente.Text);
            sqlCommand.Parameters.AddWithValue("@cod_postal", txt_CPCliente.Text);
            if (txt_cuilCliente.Text != "")
                sqlCommand.Parameters.AddWithValue("@cuil", txt_cuilCliente.Text);
            sqlCommand.Parameters.AddWithValue("@fecha_nac", Convert.ToDateTime(dtp_fecNacCliente.Text));
            baseDeDatos.ejecuta(sqlCommand);
        }

        private void txt_nroDoc_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (Char.IsDigit(e.KeyChar))
                e.Handled = false;
            else if (Char.IsControl(e.KeyChar))
                e.Handled = false;
            else
                e.Handled = true;
        }

        private void txt_telCliente_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (Char.IsDigit(e.KeyChar))
                e.Handled = false;
            else if (Char.IsControl(e.KeyChar))
                e.Handled = false;
            else
                e.Handled = true;
        }

        private void txt_nroDirCliente_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (Char.IsDigit(e.KeyChar))
                e.Handled = false;
            else if (Char.IsControl(e.KeyChar))
                e.Handled = false;
            else
                e.Handled = true;
        }

        private void txt_pisoDirCliente_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (Char.IsDigit(e.KeyChar))
                e.Handled = false;
            else if (Char.IsControl(e.KeyChar))
                e.Handled = false;
            else
                e.Handled = true;
        }

        private void txt_CPCliente_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (Char.IsDigit(e.KeyChar))
                e.Handled = false;
            else if (Char.IsControl(e.KeyChar))
                e.Handled = false;
            else
                e.Handled = true;
        }
    }
}
